# 使用networkX计算节点的pagerank
import networkx as nx
import matplotlib.pyplot as plt

# 创建有向图
G = nx.DiGraph()   
# 设置有向图的边集合
#edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
edges = [("A", "B"), ("A", "F"), ("A", "D"),("A", "E"), ("B", "C"),  ("C", "E"), ("D", "A"), ("D", "C"),("D", "E"),("E", "B"),("E", "C"),("F", "D")]
# 在有向图G中添加边集合
for edge in edges:
    G.add_edge(edge[0], edge[1])

# 有向图可视化
# NetworkX的可视化布局：
# spring_layout：中心放射状
# circular_layout：在一个圆环上均匀分布节点
# random_layout：随机分布节点
# shell_layout：节点都在同心圆上

layout = nx.spring_layout(G)
nx.draw(G, pos=layout, with_labels=True)
plt.show()

# Rank Leak（等级泄露）:一个网页没有出链，就像是一个黑洞一样，吸收了别人的影响力而不释放，最终会导致其他网页的PR值为0
# Rank Sink（等级沉没）:一个网页只有出链，没有入链。迭代下来，会导致这个网页的PR值为0
# 计算简化模型的PR值
pr = nx.pagerank(G, alpha=1)
print("简化模型的PR值：", pr)

#随机浏览模型：用户并不都是按照跳转链接的方式来上网，还有一种可能是不论当前处于哪个页面，都有概率访问到其他任意的页面
# 计算随机模型的PR值,alpha就是阻尼因子
pr = nx.pagerank(G, alpha=0.8)
print("随机模型的PR值：", pr)